# matplotlib numpy scikit-learn
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.manifold import TSNE

# 设置中文显示
plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 加载鸢尾花数据集（150个样本，4个特征，3个类别）
iris = datasets.load_iris()
X = iris.data  # 特征数据 (150, 4)
y = iris.target  # 类别标签 (150,)
target_names = iris.target_names  # 类别名称

# 使用t-SNE进行降维
# n_components=2: 降到2维空间
# perplexity=30: 近邻参数，通常在5-50之间调整
# random_state=42: 随机种子，保证结果可复现
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X)  # 执行降维
print(f'{type(X_tsne)=}')

# 可视化降维结果
plt.figure(figsize=(10, 8))
colors = ['navy', 'turquoise', 'darkorange']

for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_tsne[y == i, 0], X_tsne[y == i, 1], 
                color=color, lw=2, label=target_name)

plt.title('t-SNE降维后的鸢尾花数据集')
plt.xlabel('t-SNE维度1')
plt.ylabel('t-SNE维度2')
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.grid(True)
plt.show()    